<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Content-Language" content="zh-CN"><title>bootup
  中文手册 [金步国]</title><style>
@font-face { font-family: "JinBuGuoWebMono"; src: url("http://www.jinbuguo.com/d/mono.ttf") format("truetype"); }
* { font-family: "JinBuGuoWebMono", "Ubuntu Mono", "Consolas", "Menlo", monospace; }
body { margin:10px; }
h1 { text-align:center; background:#ddd; }
h2#auth_name { text-align:center; margin: 10px 5%; }

    a.headerlink {
      color: #c60f0f;
      font-size: 0.8em;
      padding: 0 4px 0 4px;
      text-decoration: none;
      visibility: hidden;
    }

    a.headerlink:hover {
      background-color: #c60f0f;
      color: white;
    }

    h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, dt:hover > a.headerlink {
      visibility: visible;
    }
</style><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><h1>bootup 中文手册</h1><h2 id="auth_name">译者：<strong><a href="http://www.jinbuguo.com/">金步国</a></strong></h2><hr><h3>版权声明</h3><p>本文译者是一位开源理念的坚定支持者，所以本文虽然不是软件，但是遵照开源的精神发布。</p><ul><li>无担保：本文译者不保证译文内容准确无误，亦不承担任何由于使用此文档所导致的损失。</li><li>自由使用：任何人都可以自由的<u>阅读/链接/打印</u>此文档，无需任何附加条件。</li><li>名誉权：任何人都可以自由的<u>转载/引用/再创作</u>此文档，但必须保留译者署名并注明出处。</li></ul><h3>其他作品</h3><p>本文译者十分愿意与他人分享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有的作品集：</p><ul><li><a href="http://www.jinbuguo.com/">金步国作品集</a> [ <a href="http://www.jinbuguo.com/">http://www.jinbuguo.com/</a> ]</li></ul><h3>联系方式</h3><p>由于译者水平有限，因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好)，请来信指出，任何提高译文质量的建议我都将虚心接纳。</p><ul><li>Email(QQ)：70171448在QQ邮箱</li></ul><hr><a href="systemd.index.html">手册索引</a> ·
  <a href="systemd.directives.html">指令索引</a><span style="float:right">systemd-241</span><hr><div class="refentry"><a name="bootup"></a><div class="titlepage"></div><div class="refnamediv"><h2>名称</h2><p>bootup — 系统启动流程</p></div><div class="refsect1"><a name="id-1.4"></a><h2 id="描述">描述<a class="headerlink" title="Permalink to this headline" href="bootup.html#%E6%8F%8F%E8%BF%B0">¶</a></h2><p>在系统启动过程中要涉及多个不同的组件。
    按下电源按钮后，
    首先BIOS/UEFI做最基本的硬件自检与初始化，
    然后加载预设/手动选择的磁盘/网络上的引导加载器(例如GRUB2)，
    引导加载器进一步从磁盘/网络上加载操作系统内核(例如Linux)。
    对于Linux来说，
    内核将会(可选的)解压一个initrd(initial RAM disk)镜像(可以用
    <a href="https://linux.die.net/man/8/dracut"><span class="citerefentry"><span class="refentrytitle">dracut</span>(8)</span></a>
    之类的工具生成)，并执行由"rdinit="内核引导选项指定的init程序(例如
    <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>)
    以寻找并挂载根文件系统。
    完成根文件系统的挂载之后，内核启动由"init="内核引导选项指定的init程序(例如
    <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>)
    以接管系统的控制权。
    该init程序将会负责
    检测所有其他的硬件设备、挂载必要的文件系统、启动所有必要的服务，等等。</p><p>关机时，
    init程序将会停止所有服务、
    卸载所有文件系统、
    (可选的)返回initrd环境卸载根文件系统，
    最后关闭电源。</p><p>其他有关系统启动流程的信息
    可以参考
    <a href="http://man7.org/linux/man-pages/man7/boot.7.html"><span class="citerefentry"><span class="refentrytitle">boot</span>(7)</span></a> 手册。</p></div><div class="refsect1"><a name="id-1.5"></a><h2 id="常规启动流程">常规启动流程<a class="headerlink" title="Permalink to this headline" href="bootup.html#%E5%B8%B8%E8%A7%84%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B">¶</a></h2><p>当成功挂载了"root="内核引导选项指定的根文件系统之后，内核将启动由"init="内核引导选项指定的init程序，
    从这个时间点开始，即进入了"常规启动流程"：
    检测硬件设备并加载驱动、挂载必要的文件系统、启动所有必要的服务，等等。对于
    <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>
    系统来说，上述"init程序"就是 systemd 进程，
    而整个"常规启动流程"也以几个特殊的 target 单元(详见
    <a href="systemd.target.html#"><span class="citerefentry"><span class="refentrytitle">systemd.target</span>(5)</span></a>)
    作为节点，被划分为几个阶段性步骤。
    在每个阶段性步骤内部，任务是高度并行的，
    所以无法准确预测同一阶段内单元的先后顺序，
    但是不同阶段之间的先后顺序总是固定的。</p><p>当启动系统时，
    systemd 将会以 <code class="filename">default.target</code> 为启动目标，
    借助单元之间环环相扣的依赖关系，即可完成"常规启动流程"。
     <code class="filename">default.target</code> 通常只是一个指向
    <code class="filename">graphical.target</code>(图形界面) 或
    <code class="filename">multi-user.target</code>(文本控制台) 的软连接。
    为了强制启动流程的规范性以及提高单元的并行性，
    预先定义了一些具有特定含义的 target 单元。
    详见
    <a href="systemd.special.html#"><span class="citerefentry"><span class="refentrytitle">systemd.special</span>(7)</span></a> 手册。</p><p>下面的图表解释了
    这些具有特定含义的 target 单元之间的依赖关系
    以及各自在启动流程中的位置。
    图中的箭头表示了单元之间的依赖关系与先后顺序，
    整个图表按照自上而下的时间顺序执行。</p><pre class="programlisting">local-fs-pre.target
         |
         v
 (各个 mounts 与       (各个 swap      (各个加密块设备
 fsck services……)      devices……)         devices……)          (各个底层服务:      (各个底层虚拟
         |                  |                  |              udevd, tmpfiles,    文件系统 mounts:
         v                  v                  v              random seed,        mqueue, configfs,
  local-fs.target      swap.target     cryptsetup.target          sysctl, ……)      debugfs, ……)
         |                  |                  |                    |                    |
         \__________________|_________________ | ___________________|____________________/
                                              \|/
                                               v
                                        sysinit.target
                                               |
          ____________________________________/|\________________________________________
         /                  |                  |                    |                    \
         |                  |                  |                    |                    |
         v                  v                  |                    v                    v
      (各个               (各个                |                  (各个           rescue.service
    timers……)           paths……)               |               sockets……)                |
         |                  |                  |                    |                    v
         v                  v                  |                    v              <span class="emphasis"><em>rescue.target</em></span>
   timers.target      paths.target             |             sockets.target
         .                  |                  |                    |
         .                  \_________________ | ___________________/
         .................................... \|/
                                               v
                                         basic.target
                                               |
          ____________________________________/|                                 emergency.service
         /                  |                  |                                         |
         |                  |                  |                                         v
         v                  v                  v                                 <span class="emphasis"><em>emergency.target</em></span>
     display-        (图形界面所必需    (各个系统服务)
 manager.service      的各个系统服务)          |
         |                  |                  |
         |                  |                  v
         |                  |           <span class="emphasis"><em>multi-user.target</em></span>
         |                  |                  |
         \_________________ | _________________/
                           \|/
                            v
                  <span class="emphasis"><em>graphical.target</em></span></pre><p>用<span class="emphasis"><em>斜体</em></span>标识的目标单元经常被用作启动目标。
    有两种方法可以指定启动目标：
    (1)使用
    <code class="varname">systemd.unit=</code> 内核引导选项(参见
    <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>)；
    (2)使用 <code class="filename">default.target</code> 软连接。
    </p><p>因为 <code class="filename">timers.target</code> 以异步方式包含在
    <code class="filename">basic.target</code> 中，
    所以 timer 单元可以依赖于在 <code class="filename">basic.target</code>
    之后才启动的服务。</p></div><div class="refsect1"><a name="id-1.6"></a><h2 id="initrd(Initial RAM Disk) 启动流程">initrd(Initial RAM Disk) 启动流程<a class="headerlink" title="Permalink to this headline" href="bootup.html#initrd(Initial%20RAM%20Disk)%20%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B">¶</a></h2><p>在initrd内部，
    也可以将 systemd 用作
    init程序(由"rdinit="内核引导选项指定)。</p><p>此时
    <code class="filename">initrd.target</code> 将是默认目标。
    initrd内部启动流程的上半部分与前一小节
     <code class="filename">basic.target</code> 之前的部分完全相同。
    随后的启动流程将以 <code class="filename">initrd.target</code> 为目标(如下图所示)。

    在挂载任何文件系统之前(也就是在启动 <code class="filename">local-fs-pre.target</code> 之前)，
    <code class="filename">systemd-hibernate-resume@.service</code> 将会首先完成启动，
    以检查系统是要从先前的休眠状态中恢复，
    还是要执行常规的启动流程。
    在检查完成之前，将不会挂载任何文件系统。

    当根文件系统设备可用时，将到达
    <code class="filename">initd-root-device.target</code> 目标。
    如果成功的将根文件系统挂载到
    <code class="filename">/sysroot</code> 目录，那么
    <code class="filename">sysroot.mount</code> 单元将被启动，然后进一步到达
    <code class="filename">initrd-root-fs.target</code> 目标。
    <code class="filename">initrd-parse-etc.service</code> 将会分析
    <code class="filename">/sysroot/etc/fstab</code> 文件以挂载
    <code class="filename">/usr</code> (若需要)
    与带有 <span class="emphasis"><em>x-initrd.mount</em></span> 标记的挂载点。
    所有这些挂载点都将被挂载到 <code class="filename">/sysroot</code> 之下，然后流程到达
    <code class="filename">initrd-fs.target</code> 目标。再接下来
    <code class="filename">initrd-cleanup.service</code> 将会使用 <span class="command"><strong>systemctl --no-block isolate</strong></span> 命令启动
    <code class="filename">initrd-switch-root.target</code> 目标。
    因为 isolate 表示立即停止所有在新的目标单元中不需要的进程，
    所以此动作实际上是为接下来切换根目录做预先的准备(也就是清理环境)。
    最后，启动 <code class="filename">initrd-switch-root.service</code> 服务，将系统的根目录切换至
    <code class="filename">/sysroot</code> 目录。
    </p><pre class="programlisting">
                                    (之前的流程与上一小节完全相同)
                                               :
                                               v
                                         basic.target
                                               |                                 emergency.service
                        ______________________/|                                         |
                       /                       |                                         v
                       |            initrd-root-device.target                    <span class="emphasis"><em>emergency.target</em></span>
                       |                       |
                       |                       v
                       |                  sysroot.mount
                       |                       |
                       |                       v
                       |             initrd-root-fs.target
                       |                       |
                       |                       v
                       v            initrd-parse-etc.service
              (各个自定义的                    |
             initrd services……)                v
                       |            (sysroot-usr.mount 以及
                       |             fstab 中带有 x-initrd.mount
                       |               标记的各个挂载点)
                       |                       |
                       |                       v
                       |                initrd-fs.target
                       \______________________ |
                                              \|
                                               v
                                          initrd.target
                                               |
                                               v
                                     initrd-cleanup.service
                          (使用 isolates 启动 initrd-switch-root.target)
                                               |
                                               v
                        ______________________/|
                       /                       v
                       |        initrd-udevadm-cleanup-db.service
                       v                       |
              (各个自定义的                    |
             initrd services……)                |
                       \______________________ |
                                              \|
                                               v
                                   initrd-switch-root.target
                                               |
                                               v
                                   initrd-switch-root.service
                                               |
                                               v
                                     切换到主机上的操作系统
</pre></div><div class="refsect1"><a name="id-1.7"></a><h2 id="关机流程">关机流程<a class="headerlink" title="Permalink to this headline" href="bootup.html#%E5%85%B3%E6%9C%BA%E6%B5%81%E7%A8%8B">¶</a></h2><p>systemd 系统在关机时同样遵循固定的流程，
    具体如下图所示：</p><pre class="programlisting">
     (与所有系统服务互斥)    (与所有文件系统 mounts, swaps, cryptsetup devices 互斥)
            |                                             |
            v                                             v
     shutdown.target                                 umount.target
            |                                             |
            \____________________________________   ______/
                                                 \ /
                                                  |
                                                  v
                                        (各个底层 services)
                                                  |
                                                  |
                                                  v
                                            final.target
                                                  |
                                                  |
            _____________________________________/ \_________________________________
           /                         |                        |                      \
           |                         |                        |                      |
           v                         v                        v                      v
systemd-reboot.service   systemd-poweroff.service   systemd-halt.service   systemd-kexec.service
           |                         |                        |                      |
           v                         v                        v                      v
    <span class="emphasis"><em>reboot.target</em></span>             <span class="emphasis"><em>poweroff.target</em></span>            <span class="emphasis"><em>halt.target</em></span>           <span class="emphasis"><em>kexec.target</em></span>
</pre><p>用<span class="emphasis"><em>斜体</em></span>标识的目标单元经常被用作关机目标。</p><p>注意，
    <a href="systemd-halt.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-halt.service</span>(8)</span></a>,
    <code class="filename">systemd-reboot.service</code>, <code class="filename">systemd-poweroff.service</code>,
    <code class="filename">systemd-kexec.service</code> 会将系统与 systemd(PID=1)
    带入关机流程的第二个阶段(由 <code class="filename">systemd-shutdown</code> 执行)，
    也就是不再考虑任何服务与单元等概念，
    只用一种简单粗暴的方式卸载所有文件系统、杀死所有进程、释放所有资源。
    一般来说，在第一阶段结束时，常规应用都已终止、常规资源都已释放，第二阶段只是一个兜底的安全网，
    那些在第一阶段基于单元的关闭流程中(见前文)
    未能结束的进程将被强制终止、未能释放的资源将被强制释放。</p></div><div class="refsect1"><a name="id-1.8"></a><h2 id="参见">参见<a class="headerlink" title="Permalink to this headline" href="bootup.html#%E5%8F%82%E8%A7%81">¶</a></h2><p>
      <a href="systemd.html#"><span class="citerefentry"><span class="refentrytitle">systemd</span>(1)</span></a>,
      <a href="http://man7.org/linux/man-pages/man7/boot.7.html"><span class="citerefentry"><span class="refentrytitle">boot</span>(7)</span></a>,
      <a href="systemd.special.html#"><span class="citerefentry"><span class="refentrytitle">systemd.special</span>(7)</span></a>,
      <a href="systemd.target.html#"><span class="citerefentry"><span class="refentrytitle">systemd.target</span>(5)</span></a>,
      <a href="systemd-halt.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-halt.service</span>(8)</span></a>,
      <a href="https://linux.die.net/man/8/dracut"><span class="citerefentry"><span class="refentrytitle">dracut</span>(8)</span></a>
    </p></div></div></body></html>
